package com.thz.system.config;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.region.Region;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 腾讯云COS配置类
 * 
 * @author THZ
 * @date 2025
 */
@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "tencent.cos")
public class CosConfig {
    
    /**
     * 腾讯云账号的SECRET_ID
     */
    private String secretId;
    
    /**
     * 腾讯云账号的SECRET_KEY
     */
    private String secretKey;
    
    /**
     * COS所属地域
     * 例如: ap-beijing, ap-shanghai, ap-guangzhou
     */
    private String region;
    
    /**
     * 存储桶名称
     */
    private String bucketName;
    
    /**
     * 访问域名（CDN加速域名或默认域名）
     */
    private String domain;
    
    /**
     * 是否启用COS存储（false则使用本地存储）
     */
    private Boolean enabled = false;
    
    /**
     * 上传文件存储路径前缀
     */
    private String uploadPrefix = "uploads/";
    
    /**
     * 输出文件存储路径前缀
     */
    private String outputPrefix = "output/";
    
    /**
     * 头像文件存储路径前缀
     */
    private String avatarPrefix = "avatars/";
    
    /**
     * 创建COS客户端
     */
    @Bean
    public COSClient cosClient() {
        if (!enabled) {
            log.info("COS存储未启用，将使用本地存储");
            return null;
        }
        
        log.info("初始化COS客户端 - region: {}, bucketName: {}", region, bucketName);
        
        // 1. 初始化用户身份信息(secretId, secretKey)
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        
        // 2. 设置bucket的区域
        Region regionObj = new Region(region);
        ClientConfig clientConfig = new ClientConfig(regionObj);
        
        // 【性能优化】设置超时时间，避免大文件上传时卡住
        // 连接超时：5秒
        clientConfig.setConnectionTimeout(5000);
        // Socket超时：300秒（5分钟，足够上传大文件）
        clientConfig.setSocketTimeout(300000);
        
        log.info("COS客户端超时配置 - 连接超时: 5秒, Socket超时: 300秒");
        
        // 3. 生成cos客户端
        COSClient cosClient = new COSClient(cred, clientConfig);
        
        log.info("COS客户端初始化成功");
        return cosClient;
    }
}

